# Java AspectJ Examples

## Описание
Проект с примерами подключения библиотеки AspectJ.

Проект разделен на модули, каждый из которых описывает различные способы подключения аспектов:
* связывание с использованием плагина:
  * weaving-compile-time
  * weaving-post-compile
* связывание во время выполнения:
  * weaving-load-time

#### Дополнительно

Для плагина не продемонстрировано в проекте:
* указание каталогов и шаблонов классов для просмотра через `includes/excludes`
* плетение уже скомпилированных классов проекта в секции `weaveDirectories`
* подключение скомпилированных зависимостей с аспектами в секции `aspectLibraries`

## Запуск

Описан в `README.md` каждого модуля.

## Описание терминов

* Weaving — связывание объектов с соответствующими аспектами (возможно на этапе компиляции, загрузки или выполнения программы);
* JoinPoint — точка наблюдения в выполняемой программе, где добавляется функциональность отдельной инструкции (Advice);
* `@Pointcut` ([1](https://eclipse.dev/aspectj/doc/released/progguide/semantics-pointcuts.html)/[2](https://eclipse.dev/aspectj/doc/released/progguide/quick.html)) — точка среза, включающая набор точек наблюдения (JoinPoint);
  * `execution(static * com.xyz..*.*(..))` — выполнение кода любого статического метода в пакете `com.xyz`;
  * `execution(* com.xyz..*.*(..))` — выполнение кода любого метода или конструктора в пакете `com.xyz`;
  * `call(void MyInterface.*(..))` — вызов любого метода, возвращающего `void`, интерфейса `MyInterface`;
  * `initialization(MyClass || MyOtherClass)` — инициализация класса `MyClass` или `MyOtherClass`;
  * `staticinitialization(MyClass+ && !MyClass)` — статическая инициализация класса, имя которого начинается на `MyClass`, но не сам `MyClass`;
  * `preinitialization(MyClass)` — каждая предварительная инициализация объекта, когда первый конструктор, вызванный по типу, соответствует сигнатуре, включая запись первого вызванного конструктора до вызова суперконструктора;
  * `handler(ArrayOutOfBoundsException)` — выполнение обработчика исключения `ArrayOutOfBoundsException`;
  * `get/set(static int MyClass.x)` — чтение / запись свойства `x` класса `MyClass`;
  * `this/target(MyClass)` — выполнение точки соединения, соответствующей объекту типа `MyClass`;
  * `args(Integer)` — выполнение точки соединения, в которой доступен аргумент типа `Integer`;
  * `if(thisJoinPoint.getKind().equals("call"))` — совпадает со всеми точками соединения, в которых заданное выражение истинно;
  * `within/withincode(MyClass)` — совпадает со всеми точками соединения, встречающимися в коде заданного класса;
  * `cflow/cflowbelow(call(void MyClass.test()))` — совпадает со всеми точками соединения, встречающимися в потоке выполнения заданного среза;
  * `adviceexecution()` — каждое выполнение любого набора инструкций (Advice);
  * `@annotation(MyAnnotation)` — выполнение точки соединения, цель которой помечена аннотацией `@MyAnnotation`;
* Advice — инструкции выполняемые на точках среза (Pointcut); на одной точке среза (Pointcut) может быть несколько инструкций;
  * `@Before` — запуск совета до выполнения точки соединения;
  * `@AfterReturning` — запуск совета после нормального выполнения точки соединения;
  * `@AfterThrowing` — запуск совета после выброса исключения в процессе выполнения точки соединения;
  * `@After` — запуск совета после любого варианта выполнения точки соединения;
  * `@Around` — запуск совета вместо выполнения точки соединения (выполнение точки соединения может быть вызвано внутри совета);
* `@Aspect` — модуль или класс, в котором собраны описания точек среза (Pointcut) и наборы инструкций для них (Advice);

## Ссылки

[Пример подключения](https://www.baeldung.com/aspectj)

[Аспектно-ориентированное программирование, Spring AOP](https://habr.com/ru/articles/428548/)

[Знакомство с АОП](https://habr.com/ru/articles/114649/)

[AspectJ в автоматическом тестировании — несколько практических примеров](https://habr.com/ru/companies/maxilect/articles/539904/)

[The AspectJ Programming Guide](https://eclipse.dev/aspectj/doc/released/progguide/)

[The AspectJ Development Environment Guide](https://eclipse.dev/aspectj/doc/released/devguide/index.html)

[Mojo's AspectJ Maven Plugin](https://www.mojohaus.org/aspectj-maven-plugin/index.html)